www.gusucode.com > VC++ 系统进程管理器源码-源码程序 > VC++ 系统进程管理器源码-源码程序/code/Src_EvilSword/ServiceEnum.cpp

    //Download by http://www.NewXing.com
// ServiceEnum.cpp : implementation file
//

#include "stdafx.h"
#include "EvilSword.h"
#include "ServiceEnum.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CServiceEnum dialog


CServiceEnum::CServiceEnum(CWnd* pParent /*=NULL*/)
	: CDialog(CServiceEnum::IDD, pParent)
{
	//{{AFX_DATA_INIT(CServiceEnum)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
    
}


void CServiceEnum::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CServiceEnum)
	DDX_Control(pDX, IDC_LIST1, m_ServiceList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CServiceEnum, CDialog)
	//{{AFX_MSG_MAP(CServiceEnum)
	ON_WM_SHOWWINDOW()
	ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRclickList1)
	ON_COMMAND(ID_UPDATE, OnUpdate)
	ON_COMMAND(ID_PAUSE, OnPause)
	ON_COMMAND(ID_STOP, OnStop)
	ON_COMMAND(ID_START, OnStart)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CServiceEnum message handlers




//枚举Win32服务
void CServiceEnum::ListWin32Servces()
{
   //打开服务控制管理器获得句柄
   SC_HANDLE hSCM=OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ENUMERATE_SERVICE|GENERIC_READ);
   if (hSCM==NULL)
   {
       AfxMessageBox("打开服务控制管理器失败");
       return;
   }
   //保存这个服务控制管理器的句柄
   
   //结构数组
   ENUM_SERVICE_STATUS  nService[400];
   //接收实际枚举的服务个数
   DWORD nReturn=0;
   DWORD nNeed=0;
   //开始枚举
   BOOL isSuccess=EnumServicesStatus(hSCM,        //服务控制管理器的句柄
                      SERVICE_WIN32,   //要枚举的服务类型
                      SERVICE_STATE_ALL,  //要枚举服务的状态SERVICE_STATE_ALL 表示不论活动部活动的都枚举
                      nService,             //接收返回信息的缓冲区
                      400*sizeof(ENUM_SERVICE_STATUS),     //缓冲区字节大小
                      &nNeed,               //接收返回的需要字节数
                      &nReturn,            //接收实际枚举的服务个数
                      0)   ;               //第一次调用置为0

if (isSuccess==0)
{
    AfxMessageBox("枚举失败");
    return;
}
//显示在列表
for (UINT i=0;i<nReturn;i++)
{
   m_ServiceList.InsertItem(i,nService[i].lpServiceName);
   m_ServiceList.SetItemText(i,1,nService[i].lpDisplayName);
   InsertServiceStates(i,nService[i].ServiceStatus,nService[i].lpServiceName,hSCM);
   
}
CString szText;
szText.Format("当前服务数为: %d",nReturn);
//显示进程数
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,STATIC_TISHI,szText);




}

BOOL CServiceEnum::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
    //添加列信息 由于所有的项都太长只好,自己指定列的长度,不用于项目的长度相同
    m_ServiceList.InsertColumn(0,"服务名",LVCFMT_LEFT,80);
    m_ServiceList.InsertColumn(1,"显示名称",LVCFMT_LEFT,170);
    m_ServiceList.InsertColumn(2,"状态",LVCFMT_LEFT,60);;
    m_ServiceList.InsertColumn(3,"启动类型",LVCFMT_LEFT,70);
    m_ServiceList.InsertColumn(4,"映象路径",LVCFMT_LEFT,200);
        
        //设置样式让其有表格
    m_ServiceList.SetExtendedStyle(m_ServiceList.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CServiceEnum::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
	
	// TODO: Add your message handler code here
    //只有是显示窗口状态时才 枚举
    if (bShow==TRUE)
    {
        ListWin32Servces();
    }
    
	
}
//查询状态 并写入列表控件
void CServiceEnum::InsertServiceStates(int nIndex,SERVICE_STATUS Status,LPTSTR ServiceName,SC_HANDLE hSCM)
{
    CString szType;
    //结构体变量指针 查询一个服务的状态信息
   QUERY_SERVICE_CONFIG*  ServiceConfig=(QUERY_SERVICE_CONFIG*)new BYTE[2048]; 
   switch (Status.dwCurrentState)
   {
   case SERVICE_RUNNING:
       szType.Format("%s","已启动");
       m_ServiceList.SetItemText(nIndex,2,szType);
       break;
   case SERVICE_STOPPED:
       szType.Format("%s","已停止");
       m_ServiceList.SetItemText(nIndex,2,szType);
       break;
   case SERVICE_PAUSED:
       szType.Format("%s","已暂停");
       m_ServiceList.SetItemText(nIndex,2,szType);
       break;
   default:
       szType.Format("%s","未知状态");
       m_ServiceList.SetItemText(nIndex,2,szType);
       break;
   }
   //根据服务名和控制服务器句柄打开服务SERVICE_QUERY_CONFIG权限 来查询其启动类型
   SC_HANDLE hService=OpenService(hSCM,ServiceName,SERVICE_QUERY_CONFIG);
   if (hService==NULL)
   {
       AfxMessageBox(TEXT("打开服务失败"));
       return;
   }
   DWORD nRet=0;
   //查询
   if (QueryServiceConfig(hService,ServiceConfig,2048,&nRet))
   {
       //启动类型
       switch(ServiceConfig->dwStartType)
       {
       case SERVICE_AUTO_START:
           szType.Format("%s","自动");
           m_ServiceList.SetItemText(nIndex,3,szType);
           break;
       case SERVICE_DEMAND_START:
           szType.Format("%s","手动");
           m_ServiceList.SetItemText(nIndex,3,szType);
           break;
       case SERVICE_DISABLED:
           szType.Format("%s","已禁用");
           m_ServiceList.SetItemText(nIndex,3,szType);
           break;
       case SERVICE_BOOT_START:
           szType.Format("%s","引导启动");
           m_ServiceList.SetItemText(nIndex,3,szType);
           break;
       case SERVICE_SYSTEM_START:
           szType.Format("%s","系统启动");
           m_ServiceList.SetItemText(nIndex,3,szType);
           break;
       default:
           szType.Format("%s","未知");
           m_ServiceList.SetItemText(nIndex,3,szType);
           break;
       }
       //添加映象路径
       m_ServiceList.SetItemText(nIndex,4,ServiceConfig->lpBinaryPathName);

   }

}
//右键单击消息处理
void CServiceEnum::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
    POINT pt;
    //获取鼠标光标的位置
    GetCursorPos(&pt);
    
    CMenu menu;
    //加载菜单资源 
    menu.LoadMenu(105);
    //弹出
	menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this);

	
	*pResult = 0;
}

void CServiceEnum::OnUpdate() 
{
	// TODO: Add your command handler code here
    m_ServiceList.DeleteAllItems();
    ListWin32Servces();
	
}
//暂停服务
void CServiceEnum::OnPause() 
{
	// TODO: Add your command handler code here
    POSITION ps=m_ServiceList.GetFirstSelectedItemPosition();
    //如果没得到位置就不做任何处理
    if (ps==NULL)
    {
        return;
    }
    //得到选中的行的索引
    int nIndex=m_ServiceList.GetNextSelectedItem(ps);
    //得到选中的服务的运行状态
    CString szText=m_ServiceList.GetItemText(nIndex,2);
    if (szText.CompareNoCase("已暂停")==0)
    {
        AfxMessageBox(TEXT("服务已经暂停不需要再暂停"));
        return;
    }
    //打开服务控制管理器获得句柄
    SC_HANDLE hSCM=OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ENUMERATE_SERVICE|GENERIC_READ);
    if (hSCM==NULL)
    {
        AfxMessageBox("打开服务控制管理器失败");
        return;
   }
    
    //得到服务名
    szText=m_ServiceList.GetItemText(nIndex,0);
    //通过服务名打开服务
    SC_HANDLE hService=OpenService(hSCM,szText,SERVICE_ALL_ACCESS|SERVICE_PAUSE_CONTINUE);
    //给服务发送控制码来停止服务
    BOOL isSuccess= ControlService(hService,SERVICE_CONTROL_PAUSE,NULL);
    //关闭句柄
    CloseHandle(hService);
    if (!isSuccess)
    {
        AfxMessageBox(TEXT("暂停失败"));
        return;
    }

	
}
//停止服务
void CServiceEnum::OnStop() 
{
	// TODO: Add your command handler code here
    POSITION ps=m_ServiceList.GetFirstSelectedItemPosition();
    //如果没得到位置就不做任何处理
    if (ps==NULL)
    {
        return;
    }
    //得到选中的行的索引
    int nIndex=m_ServiceList.GetNextSelectedItem(ps);
    //得到选中的服务的运行状态
    CString szText=m_ServiceList.GetItemText(nIndex,2);
    if (szText.CompareNoCase("已停止")==0)
    {
        AfxMessageBox(TEXT("服务已经停止不需要再停止"));
        return;
    }
    //打开服务控制管理器获得句柄
    SC_HANDLE hSCM=OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ENUMERATE_SERVICE|GENERIC_READ);
    if (hSCM==NULL)
    {
        AfxMessageBox("打开服务控制管理器失败");
        return;
   }
    //得到服务名
    szText=m_ServiceList.GetItemText(nIndex,0);
    //通过服务名打开服务
    SC_HANDLE hService=OpenService(hSCM,szText,SERVICE_ALL_ACCESS|SERVICE_STOP );
    //给服务发送控制码来停止服务
    BOOL isSuccess= ControlService(hService,SERVICE_CONTROL_STOP,NULL);
    //关闭句柄
    CloseHandle(hService);
    if (!isSuccess)
    {
        AfxMessageBox(TEXT("停止失败"));
        return;
    }
	
}
//开始服务
void CServiceEnum::OnStart() 
{
	// TODO: Add your command handler code here
    POSITION ps=m_ServiceList.GetFirstSelectedItemPosition();
    //如果没得到位置就不做任何处理
    if (ps==NULL)
    {
        return;
    }
    //得到选中的行的索引
    int nIndex=m_ServiceList.GetNextSelectedItem(ps);
    //得到选中的服务的运行状态
    CString szText=m_ServiceList.GetItemText(nIndex,2);
    if (szText.CompareNoCase("已启动")==0)
    {
        AfxMessageBox(TEXT("服务已经启动不需要在启动"));
        return;
    }
    //打开服务控制管理器获得句柄
    SC_HANDLE hSCM=OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ENUMERATE_SERVICE|GENERIC_READ);
    if (hSCM==NULL)
    {
        AfxMessageBox("打开服务控制管理器失败");
        return;
   }
    //得到服务名
    szText=m_ServiceList.GetItemText(nIndex,0);
    //通过服务名打开服务
    SC_HANDLE hService=OpenService(hSCM,szText,SERVICE_ALL_ACCESS|SERVICE_START);
    BOOL isSuccess= StartService(hService,NULL,NULL);
    //关闭句柄
    CloseHandle(hService);
    if (!isSuccess)
    {
     AfxMessageBox(TEXT("开启失败"));
     return;
    }

	
}